package com.och.mrcp.service;

import com.och.mrcp.config.EngineConfig;
import com.och.mrcp.model.RecognitionResult;

import java.util.concurrent.CompletableFuture;

/**
 * 语音服务会话管理接口
 * 为不同的语音服务提供商提供统一的会话管理能力
 */
public interface VoiceSessionService {
    
    /**
     * 会话状态枚举
     */
    enum SessionState {
        CREATED,      // 已创建
        STARTING,     // 启动中
        ACTIVE,       // 活跃中
        STOPPING,     // 停止中
        STOPPED,      // 已停止
        ERROR         // 错误状态
    }
    
    /**
     * 会话结果回调接口
     */
    interface SessionCallback {
        /**
         * 处理中间识别结果
         */
        void onIntermediateResult(String sessionId, RecognitionResult result);
        
        /**
         * 处理最终识别结果
         */
        void onFinalResult(String sessionId, RecognitionResult result);
        
        /**
         * 处理错误
         */
        void onError(String sessionId, Exception error);
        
        /**
         * 会话状态变更
         */
        void onStateChanged(String sessionId, SessionState oldState, SessionState newState);
    }
    
    /**
     * 创建语音识别会话
     * @param sessionId 会话ID
     * @param config 识别配置
     * @param callback 结果回调
     * @return 创建结果
     */
    CompletableFuture<Void> createRecognitionSession(String sessionId, 
                                                   EngineConfig.RecognitionConfig config,
                                                   SessionCallback callback);
    
    /**
     * 启动语音识别会话
     * @param sessionId 会话ID
     * @return 启动结果
     */
    CompletableFuture<Void> startRecognitionSession(String sessionId);
    
    /**
     * 发送音频数据到会话
     * @param sessionId 会话ID
     * @param audioData 音频数据
     * @return 处理结果
     */
    CompletableFuture<Void> sendAudioData(String sessionId, byte[] audioData);
    
    /**
     * 停止语音识别会话
     * @param sessionId 会话ID
     * @return 停止结果
     */
    CompletableFuture<Void> stopRecognitionSession(String sessionId);
    
    /**
     * 销毁语音识别会话
     * @param sessionId 会话ID
     * @return 销毁结果
     */
    CompletableFuture<Void> destroyRecognitionSession(String sessionId);
    
    /**
     * 获取会话状态
     * @param sessionId 会话ID
     * @return 会话状态
     */
    SessionState getSessionState(String sessionId);
    
    /**
     * 检查会话是否存在
     * @param sessionId 会话ID
     * @return 是否存在
     */
    boolean sessionExists(String sessionId);
    
    /**
     * 获取活跃会话数量
     * @return 活跃会话数量
     */
    int getActiveSessionCount();
    
    /**
     * 清理所有会话
     */
    void cleanupAllSessions();
    
    /**
     * 获取服务提供商名称
     * @return 提供商名称
     */
    String getProviderName();
}
